package com.iams.manage.service.impl;

import java.util.List;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.iams.common.utils.DateUtils;
import com.iams.manage.domain.ExtraInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.iams.manage.mapper.DocumentMapper;
import com.iams.manage.domain.Document;
import com.iams.manage.service.IDocumentService;

/**
 * 文档信息Service业务层处理
 * 
 * @author zhjm
 * @date 2025-01-10
 */
@Service
public class DocumentServiceImpl implements IDocumentService 
{
    @Autowired
    private DocumentMapper documentMapper;

    /**
     * 查询文档信息
     * 
     * @param id 文档信息主键
     * @return 文档信息
     */
    @Override
    public Document selectDocumentById(Long id)
    {
        return documentMapper.selectDocumentById(id);
    }

    /**
     * 查询文档信息列表
     * 
     * @param document 文档信息
     * @return 文档信息
     */
    @Override
    public List<Document> selectDocumentList(Document document)
    {
        return documentMapper.selectDocumentList(document);
    }

    /**
     * 查询文档信息列表
     *
     * @param ids 需要查询的文档信息主键
     * @return 文档信息
     */
    @Override
    public List<Document> selectDocumentListByIds(Long[] ids)
    {
        return documentMapper.selectDocumentListByIds(ids);
    }

    /**
     * 新增文档信息
     * 
     * @param document 文档信息
     * @return 结果
     */
    @Override
    public Long insertDocument(Document document)
    {
        document.setCreateTime(DateUtils.getNowDate());
        int rows = documentMapper.insertDocument(document);
        return document.getId();
    }

    /**
     * 修改文档信息
     * 
     * @param document 文档信息
     * @return 结果
     */
    @Override
    public int updateDocument(Document document)
    {
        document.setUpdateTime(DateUtils.getNowDate());
        return documentMapper.updateDocument(document);
    }

    /**
     * 批量删除文档信息
     * 
     * @param ids 需要删除的文档信息主键
     * @return 结果
     */
    @Override
    public int deleteDocumentByIds(Long[] ids)
    {
        return documentMapper.deleteDocumentByIds(ids);
    }

    /**
     * 删除文档信息信息
     * 
     * @param id 文档信息主键
     * @return 结果
     */
    @Override
    public int deleteDocumentById(Long id)
    {
        return documentMapper.deleteDocumentById(id);
    }

    /**
     * 查询文档最大序号
     *
     * @param id 文档信息主键
     * @return 最大序号
     */
    @Override
    public Long selectMaxXuhaoByArchiveId(Long id)
    {
        return documentMapper.selectMaxXuhaoByArchiveId(id);
    }

    /**
     * 修改文档额外信息
     *
     * @param extraInfo 文档信息主键
     * @return 结果
     */
    @Override
    public int updateDocExtraInfo(ExtraInfo extraInfo) {
        ObjectMapper objectMapper = new ObjectMapper();

        // 获取文档信息
        Document document = documentMapper.selectDocumentById(extraInfo.getId());
        if (document == null) {
            throw new IllegalArgumentException("文档不存在，ID: " + extraInfo.getId());
        }

        // 获取现有的额外信息
        String docExtraInfo = document.getExtraInfo();

        try {
            ArrayNode arrayNode;
            if (docExtraInfo == null || docExtraInfo.trim().isEmpty()) {
                // 创建一个新的JSON数组
                arrayNode = objectMapper.createArrayNode();
            } else {
                // 解析现有的JSON字符串为JsonNode
                JsonNode jsonNode = objectMapper.readTree(docExtraInfo);

                // 检查是否是ArrayNode
                if (jsonNode instanceof ArrayNode) {
                    arrayNode = (ArrayNode) jsonNode;
                } else if (jsonNode instanceof ObjectNode) {
                    // 如果是ObjectNode，将其转换为ArrayNode
                    arrayNode = objectMapper.createArrayNode();
                    arrayNode.add(jsonNode);
                } else {
                    // 如果既不是ObjectNode也不是ArrayNode，可以抛出异常或处理其他情况
                    throw new IllegalArgumentException("Unsupported JSON node type: " + jsonNode.getNodeType());
                }
            }

            // 检查是否已经存在具有相同 label 的 ObjectNode
            boolean updated = false;
            for (JsonNode node : arrayNode) {
                if (node instanceof ObjectNode) {
                    ObjectNode objectNode = (ObjectNode) node;
                    if (objectNode.has("label") && objectNode.get("label").asText().equals(extraInfo.getLabel())) {
                        // 更新 value
                        objectNode.put("value", extraInfo.getValue());
                        updated = true;
                        break;
                    }
                }
            }

            // 如果没有找到具有相同 label 的 ObjectNode，则添加新的 ObjectNode
            if (!updated) {
                ObjectNode newObjectNode = objectMapper.createObjectNode();
                newObjectNode.put("label", extraInfo.getLabel());
                newObjectNode.put("value", extraInfo.getValue());
                arrayNode.add(newObjectNode);
            }

            docExtraInfo = arrayNode.toString();
            System.out.println(docExtraInfo);
            document.setExtraInfo(docExtraInfo);

            // 更新数据库中的文档信息
            return documentMapper.updateDocExtraInfo(document);
        } catch (JsonProcessingException e) {
            // 记录异常日志
            e.printStackTrace();
            throw new RuntimeException("解析或生成 JSON 时出错：" + e.getMessage(), e);
        } catch (Exception e) {
            // 记录其他异常日志
            e.printStackTrace();
            throw new RuntimeException("更新文档额外信息失败：" + e.getMessage(), e);
        }
    }
}
